home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Other Stuff / Other Stuff ’97 / PowerOS Development / basic kernel source / exception_stub.s < prev    next >
Text File  |  1997-06-26  |  2KB  |  108 lines

  1. /*
  2.     exceptions.s
  3.     exception handler entries for PowerOS
  4.     copyright 1996-1997 by Ben Martz
  5.     all rights reserved world wide
  6.  
  7.     ANY AND ALL MODIFICATIONS TO THIS SOURCE MUST CREDIT THE ORIGINAL
  8.     AUTHOR, BEN MARTZ (benmartz@ic.net), AND MUST BE GIVEN TO THE AUTHOR
  9.     FOR INTEGRATION INTO THE MAIN PowerOS SOURCE TREE. THANK YOU FOR YOUR
  10.     COOPERATION!
  11. */
  12.  
  13. #define     _exception(addr, entry)    exception(addr, _UnknownException)
  14.  
  15. /******************************************************************************/
  16.  
  17. #define    exception(addr, entry) \
  18.     . = addr; \
  19.     b entry;
  20.  
  21. /******************************************************************************/
  22.  
  23. #define    ENTER_EXCEPTION \
  24.     /* save r30 and r31 so that we can use them */ \
  25.     mtsprg    0,r31; \
  26.     mtsprg    1,r30; \
  27.     /* put the exception_frame into r31 */ \
  28.     lis    r31,exception_frame@ha; \
  29.     ori    r31,r31,exception_frame@l; \
  30.     /* save XER, CTR, CR, LR */ \
  31.     mfxer    r30; \
  32.     stw    r30,0(r31); \
  33.     mfctr    r30; \
  34.     stw    r30,4(r31); \
  35.     mfcr    r30; \
  36.     stw    r30,8(r31); \
  37.     mflr    r30; \
  38.     stw    r30,12(r31); \
  39.     /* save r0 - r12 */ \
  40.     stw    r0,16(r31); \
  41.     stw    r1,20(r31); \
  42.     stw    r2,24(r31); \
  43.     stw    r3,28(r31); \
  44.     stw    r4,32(r31); \
  45.     stw    r5,36(r31); \
  46.     stw    r6,40(r31); \
  47.     stw    r7,44(r31); \
  48.     stw    r8,48(r31); \
  49.     stw    r9,52(r31); \
  50.     stw    r10,56(r31); \
  51.     stw    r11,60(r31); \
  52.     stw    r12,64(r31); \
  53.     /* move to the kernel stack */ \
  54.     lis    r31,kernel_stack@ha; \
  55.     ori    r31,r31,kernel_stack@l; \
  56.     mr    r1,r31; \
  57.     /* save the exception MSR */ \
  58.     mfmsr    r31; \
  59.     mtsprg    2,r31; \
  60.     /* turn on address translation */ \
  61.     lis    r31,MSR_KERNEL@h; \
  62.     ori    r31,r31,MSR_KERNEL@l; \
  63.     mtmsr    r31; \
  64.     sync;
  65.     
  66. /******************************************************************************/
  67.  
  68. #define    EXIT_EXCEPTION \
  69.     /* restore the exception MSR */ \
  70.     mfsprg    r31,2; \
  71.     mtmsr    r31; \
  72.     sync; \
  73.     /* put the exception_frame into r31 */ \
  74.     lis    r31,exception_frame@ha; \
  75.     ori    r31,r31,exception_frame@l; \
  76.     /* restore XER, CTR, CR, LR */ \
  77.     lwz    r30,0(r31); \
  78.     mtxer    r30; \
  79.     lwz    r30,4(r31); \
  80.     mtctr    r30; \
  81.     lwz    r30,8(r31); \
  82.     mtcr    r30; \
  83.     lwz    r30,12(r31); \
  84.     mtlr    r30; \
  85.     /* restore r0 - r12 */ \
  86.     lwz    r0,16(r31); \
  87.     lwz    r1,20(r31); \
  88.     lwz    r2,24(r31); \
  89.     lwz    r3,28(r31); \
  90.     lwz    r4,32(r31); \
  91.     lwz    r5,36(r31); \
  92.     lwz    r6,40(r31); \
  93.     lwz    r7,44(r31); \
  94.     lwz    r8,48(r31); \
  95.     lwz    r9,52(r31); \
  96.     lwz    r10,56(r31); \
  97.     lwz    r11,60(r31); \
  98.     lwz    r12,64(r31); \
  99.     /* set up the new MSR for rfi */ \
  100.     lis    r30,MSR_KERNEL@h; \
  101.     ori    r30,r30,MSR_KERNEL@l; \
  102.     mtsrr1    r30; \
  103.     /* restore r30 and r31 */ \
  104.     mfsprg    r31,0; \
  105.     mfsprg    r30,1; \
  106.     /* return */ \
  107.     rfi;
  108.